package com.scott.observer.core;

import java.util.ArrayList;
import java.util.List;

/**
 * 被观察对象抽象类
 */
public abstract class Subject {
    /**
     * 已经注册的观察者对象列表
     */
    private List<Observer> observerList = new ArrayList<>();


    /**
     * 注册观察者
     *
     * @param observer 观察者
     */
    public void register(Observer observer) {
        this.observerList.add(observer);
    }

    public void removeObserver(Observer observer) {
        this.observerList.remove(observer);
    }

    /**
     * 更新所有观察者的状态
     *
     * @param newState 新状态
     */
    protected void notifyObservers(String newState) {
        //此处应该使用迭代器模式，进行重构 Iterator Pattern，构建一个顺序列表，通过迭代器模式，按照顺序依次通知观察者数据发生了变化
        observerList.forEach(observer -> {
            System.out.printf("通知【%s】更新状态\n",observer.getName());
            observer.update(newState);
        });
    }


    /**
     * 修改状态
     *
     * @param newState 新状态
     */
    public abstract void changeState(String newState);

    /**
     * 获取状态
     */
    public abstract String getState();


}
